package com.hon.legionnaire.negocio.dao;

import java.util.Collections;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Service;

import com.hon.legionnaire.negocio.vo.UsuarioVO;

@Service("usuarioDAO")
public class UsuarioDAO {

	@PersistenceContext
	private EntityManager entityManager;

	public void inserirUsuario(UsuarioVO usuarioVO) {		
		try {
			UsuarioVO usuarioVOAux = new UsuarioVO();
			
			usuarioVOAux.setFuncionarioVO(usuarioVO.getFuncionarioVO());
			usuarioVOAux = this.obterUsuario(usuarioVOAux);
			
			if ((usuarioVOAux == null ) || (usuarioVOAux.getUsuario().equals(""))) {
				entityManager.persist(usuarioVO);
			} else {
				entityManager.merge(usuarioVO);
			}
		} catch (Exception e) {
			throw new RuntimeException("Erro ao inserir usuario: " + e.getMessage(), e);
		}
	}

	public void removerUsuario(UsuarioVO usuarioVO) {
		try {
			if (!entityManager.contains(usuarioVO)) {
				usuarioVO = entityManager.merge(usuarioVO);
			}
			entityManager.remove(usuarioVO);
		} catch (Exception e) {
			throw new RuntimeException("Erro ao remover usuario: " + e.getMessage(), e);
		}
	}

	public UsuarioVO obterUsuario(UsuarioVO usuarioVO) {
		try {
			if (((usuarioVO.getUsuario() != null) && (!usuarioVO.getUsuario().equals(""))) &&
				((usuarioVO.getSenha() != null) && (!usuarioVO.getSenha().equals("")))) {
				Query query = entityManager.createNamedQuery("findUsuario");
				query.setParameter("usuario", usuarioVO.getUsuario());
				query.setParameter("senha", usuarioVO.getSenha());
				usuarioVO = (UsuarioVO) query.getSingleResult();
			} else if ((usuarioVO.getFuncionarioVO() != null) &&
					   (usuarioVO.getFuncionarioVO().getCodigo() != 0)) {
				Query query = entityManager.createNamedQuery("findUsuarioPorFuncionario");
				query.setParameter("cod_funcionario", usuarioVO.getFuncionarioVO().getCodigo());
				try{
					usuarioVO = (UsuarioVO) query.getSingleResult();
				}
				catch(Exception e){
					return null;
				}
			}
			return usuarioVO;
		} catch (Exception e) {
			throw new RuntimeException("Erro ao buscar usuario: Login ou Senha incorretos!", e);
		}
	}

	@SuppressWarnings("unchecked")
	public List<UsuarioVO> obterListaUsuario() {
		try {
			List<UsuarioVO> lista = (List<UsuarioVO>) entityManager.createNamedQuery("loadAllUsuario").getResultList();
			if ((lista != null) && (!lista.isEmpty())) {
				return lista;
			} else {
				return Collections.EMPTY_LIST;
			}
		} catch (Exception e) {
			throw new RuntimeException("Erro ao carregar todos os usuarios.", e);
		}
	}
	
	public boolean validaDuplicado(UsuarioVO usuarioVO) {
		Query query = entityManager.createNamedQuery("findDuplicatedUsuario");
		query.setParameter("cod_funcionario", usuarioVO.getFuncionarioVO().getCodigo());
		query.setParameter("usuario", usuarioVO.getUsuario());
		@SuppressWarnings("unchecked")
		List lista = query.getResultList();
		if (lista.isEmpty()) {
			return true;
		} else {
			return false;
		}
	}

	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

}